package main

import (
	"bufio"
	"context"
	"fmt"
	"math/rand"
	"os"
	"sync"
	"time"

	"github.com/xjtulls/client/proto/heartbeat"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
)

func simulateHeartbeat(clientID int64, client heartbeat.HeartbeatServiceClient, wg *sync.WaitGroup) {
	defer wg.Done()

	// 随机决定这个客户端要发送多少次心跳包
	numHeartbeats := rand.Intn(51) + 50 // 50 到 100 次心跳包

	for i := 0; i < numHeartbeats; i++ {
		// 模拟发送心跳包
		_, err := client.SendHeartbeat(context.Background(), &heartbeat.HeartbeatRequest{
			ClientId: clientID,
		})

		if err != nil {
			fmt.Printf("客户端 %d 发送心跳失败: %v\n", clientID, err)
			return
		}

		// 打印服务器返回的在线客户端数量
		// fmt.Printf("客户端 %s 第 %d 次心跳: 在线客户端数量: %d\n", clientID, i+1, rsp.GetOnlineClients())

		// 模拟间隔5s 一段时间发送心跳
		time.Sleep(5 * time.Second) // 每次发送心跳包的间隔为 1 到 3 秒
	}
}

func main() {
	var serviceHost = "127.0.0.1:8001"

	// 连接到 gRPC 服务器
	conn, err := grpc.NewClient(serviceHost, grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		fmt.Println(err)
		return
	}
	defer conn.Close()

	// 创建 gRPC 客户端
	client := heartbeat.NewHeartbeatServiceClient(conn)

	var wg sync.WaitGroup
	numClients := 10_000 // 模拟 10k 个客户端

	// 启动模拟的 10k 个客户端
	for i := 0; i < numClients; i++ {
		wg.Add(1)
		clientId := (int64)(i + 1)
		go simulateHeartbeat(clientId, client, &wg)
	}

	// 等待所有客户端完成发送心跳
	wg.Wait()

	// 程序退出前等待用户输入
	fmt.Println("按回车键退出程序...")
	in := bufio.NewReader(os.Stdin)
	_, _, _ = in.ReadLine()
}
